package com.guodi.model.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.guodi.common.utils.PageData;
import com.guodi.map.entity.MapDivision;
import com.guodi.model.dto.IdtIndicatorsRelTree;
import com.guodi.model.entity.ApiIdtIndicatorsDir;
import com.guodi.model.entity.ApiIndicatorsVal;
import com.guodi.model.entity.IdtIndicators;
import com.guodi.model.entity.MdlModelResult;

import java.util.List;
import java.util.Map;

/**
 * @描述：指标接口
 * @作者: 彭辉
 * @日期: 2020-06-05
 */
public interface IIdtIndicatorsService extends IService<IdtIndicators> {

    /**
     * 删除指标，会级联删除指标上报值、监测值、目标值、对标关系、上报值填报记录、监测值填报记录
     * @入参： indicatorIds 如果有多个，英文逗号隔开
     * @出参： 删除指标数
     * @作者: 陈宏成
     * @日期: 2021/02/07 11:23
     */
    int deleteIndicatorByIds(List<String> indicatorIds);

    /**
    * @描述: 更新指标监测值的更新状态
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/10/23 15:31
    **/
    void updateStatus(String indicatorsId);

    /**
    * @描述: 更新指标上报值的更新状态
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/7 15:45
    **/
    List<IdtIndicators> updateReportStatus(String indicatorsId);

    /**
    * @描述: 更新指标表中的排序状态
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/10/27 17:10
    **/
    void updateSortStatus(List<String> ids, String userId, Integer sortStatus);

    /**
    * @描述: 根据分类code查询目录下所有指标
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/7 10:35
    **/
    List<IdtIndicators> listByCode(String code);

    /**
    * @描述: 根据项目编码获取指标ID
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/10 15:30
    **/
    List<String> listEntityByCode(List<String> codes);

    /**
    * @描述: 根据指标ID获取复合指标关联ID
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/10 16:02
    **/
    String[] listInIndicatorsIds(String indicatorsId);

    /**
     * @描述: 获取指标树状图
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2020/12/29
     **/
    List<IdtIndicatorsRelTree> getIdtIndicatorsTree(String dirId, String name);

    /**
     * @描述:获取新增指标项编码
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/1/21
     **/
    String getAddIdtIndicatorsCode();

    /**
     * @描述: 获取单位名称集合
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/1/25 16:50
     **/
    Map<String, String> getDeptNameMap();

    /**
     * @描述: 获取单位名称集合
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/1/25 16:50
     **/
    Map<String, String> getDeptIdMap();

    /**
     * @描述: 获取单位名称字符串
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/1/25 16:50
     **/
    String getDeptNameStr(String deptIds, Map<String, String> deptMap);

    /**
    * @描述: 解析模型结果数据
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2021/7/6 10:27
    **/
    List<Map<String, String>> analysisModelResult(List<MdlModelResult> mdlModelResults, IdtIndicators idtIndicators);

    /**
    * @描述: 更新指标预警状态
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2021/8/4 11:21
    **/
    String updateWarnStatus(ApiIndicatorsVal apiIndicatorsVal);

    /**
     *  (新)查询指标数值，仅查询单指标单年份单行政区划
     * @入参: idtId 指标id
     * @入参: queryTime 查询时间字符串。
     *          如果是按年查询："2020"；如果是按季查询："2020-1"；如果是按月查询："2020-01"。
     *          不能混搭
     * @入参: divisionCode 行政区划编码
     * @入参: isFillZero 如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参: ApiIndicatorsVal 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    ApiIndicatorsVal getIdtVal(String idtId, String queryTime, String divisionCode, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，仅查询单指标多年份多行政区划
     * @入参: idtId 指标id
     * @入参: queryTimes 查询时间字符串，如果有多个，英文逗号隔开。
     *          如果是按年查询："2020,2021,2022"；如果是按季查询："2020-1,2020-2,2020-3"；如果是按月查询："2020-01,2020-02,2020-03"。
     *          不能混搭
     * @入参: divisionCodes 行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参:  ApiIndicatorsVal 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。 如果没有，将返回空列表
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    List<ApiIndicatorsVal> listSingleIdtVal(String idtId, String queryTimes, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，仅查询单指标指定监测时间范围内多行政区划
     * @入参: idtId 指标id
     * @入参: queryTimeBegin 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: queryTimeEnd 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: divisionCodes 行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参:  ApiIndicatorsVal 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。 如果没有，将返回空列表
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    List<ApiIndicatorsVal> listRangeIdtVal(String idtId, String queryTimeBegin, String queryTimeEnd, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，查询多指标多年份多行政区划
     * @入参: idtIds  必填，指标id列表
     * @入参: queryTimes 查询时间字符串，如果有多个，英文逗号隔开。
     *          如果是按年查询："2020,2021,2022"；如果是按季查询："2020-1,2020-2,2020-3"；如果是按月查询："2020-01,2020-02,2020-03"。
     *          不能混搭
     * @入参: divisionCodes 必填，行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 必填，如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 必填，是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参: List<ApiIndicatorsVal></ApiIndicatorsVal> 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    List<ApiIndicatorsVal> listIdtVal(List<String> idtIds, String queryTimes, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，查询多指标多年份多行政区划
     * @入参: idtIds  必填，指标id列表
     * @入参: queryTimeBegin 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: queryTimeEnd 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: divisionCodes 必填，行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 必填，如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 必填，是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参: List<ApiIndicatorsVal></ApiIndicatorsVal> 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    List<ApiIndicatorsVal> listIdtVal(List<String> idtIds, String queryTimeBegin, String queryTimeEnd, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，查询多指标多年份多行政区划
     * @入参: idtIds  必填，指标id列表
     * @入参: queryTimeBegin 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: queryTimeEnd 查询时间字符串，年：2020；月：2020-01；季度：2020-1
     * @入参: divisionCodes 必填，行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 必填，如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 必填，是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参: Map-key: 指标id。Map-value: ApiIndicatorsVal 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    Map<String, List<ApiIndicatorsVal>> mapIdtVal(List<String> idtIds, String queryTimeBegin, String queryTimeEnd, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     *  (新)查询指标数值，查询多指标多年份多行政区划
     * @入参: idtIds  必填，指标id列表
     * @入参: queryTimes 查询时间字符串，如果有多个，英文逗号隔开。
     *                如果是按年查询："2020,2021,2022"；如果是按季查询："2020-1,2020-2,2020-3"；如果是按月查询："2020-01,2020-02,2020-03"。
     *                不能混搭
     * @入参: divisionCodes 必填，行政区划编码字符串，如果有多个，英文逗号隔开
     * @入参: isFillZero 必填，如果监测值/上报值/基期值/规划值不存在时，是否填充 0 ，true-填充，false-不填充
     * @入参: isReportValueForGrowthRatio 必填，是否使用上报值来计算增长率。true-使用上报值计算，false-使用监测值计算
     * @出参: Map-key: 指标id。Map-value: ApiIndicatorsVal 会查询指标的监测值、地区平均监测值、上报值、基期年、基期值、规划年、规划值、预警状态等基本数值字段。
     * @作者: 陈宏成
     * @日期: 2021-08-04
     **/
    Map<String, List<ApiIndicatorsVal>> mapIdtVal(List<String> idtIds, String queryTimes, String divisionCodes, boolean isFillZero, boolean isReportValueForGrowthRatio);

    /**
     * @描述: 计算差值 正向指标：监测值-规划值，反向指标：规划值-监测值
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/1/7
     **/
    Double countDiffValue(String warnName, String targetValue, String monitorValue);

    /**
     * 判断是否存在同名指标
     * @param idtName 指标名，不能为空
     * @param idtId 指标id，可以为空，如果不为空，将会比较同名的是不是自己
     * @return true -- 存在其他同名指标，false -- 不存在其他同名指标
     * @author 陈宏成
     * @date   2021/12/10
     */
    boolean hasName(String idtName, String idtId);

    /**
     * 获取非复合指标列表，不分页 <br/><br/><br/>
     * 2021-12-21 为了避免指标计算公式出现A=B+C，C=E+D这种链式的情况，所有复合指标禁止作为计算公式的因子 <br/><br/>
     * 同样的因子可以被引用多次到公式，只是因子不能再被配公式 <br/><br/>
     * 有可能一个因子b是模型算的，一个因子c是系统对接的，指标a=b+c就是自动算的<br/><br/>
     * @param excludeIdList 要排除的指标id列表，可以为空
     * @author 陈宏成
     * @date   2021/12/21
     */
    List<IdtIndicators> listNonCompositeIdts(List<String> excludeIdList);

    /**
     * 根据指标，查询相关联的复合指标
     * @param idtId 指标id
     * @param idtCode 指标编码
     * @return 例如存在指标计算公式 A=B+C ; E=B+F ，（B）--> A、E
     * @author 陈宏成
     * @date   2021/12/21
     */
    List<IdtIndicators> findCompositeIdts(String idtId, String idtCode);

    /**
     * @描述:查行政区划
     * @入参:
     * @出参:
     * @作者: lzy
     * @日期: 2023/3/28 9:04
     **/
    public List<PageData> listDivisionByEntity(PageData pd);

    /**
     * @描述: 查询某一年、多个行政区、多个指标的数值与状态
     * @入参:
     * @出参:
     * @作者: lzy
     * @日期: 2023/5/6 10:37
     **/
    List<ApiIndicatorsVal> mapIdtVal3(List<ApiIdtIndicatorsDir> idtIdList, String year, MapDivision divisionCode, List<ApiIdtIndicatorsDir> dirs, List<String> idtIds);
}
